package de.lengnis.games.brickdrop.model;

import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;

public class Brick {

    private BrickTyp        typ;

    private int             drehungInGrad = 0;

    private List<TeilBrick> teilBricks    = new ArrayList<TeilBrick>();

    public void malen(Graphics2D g2) {

        for (TeilBrick teilBrick : teilBricks)
            teilBrick.malen(g2);
    }

    public void bewegen(int x, int y) {

        for (TeilBrick teilBrick : teilBricks)
            teilBrick.bewegen(x, y);
    }

    public void drehen() {

        if (drehungInGrad <= 180)
            drehungInGrad += 90;
        else
            drehungInGrad = 0;

        TeilBrick ersterTeilBrick = teilBricks.get(0);
        TeilBrick zweiterTeilBrick = teilBricks.get(1);
        TeilBrick dritterTeilBrick = teilBricks.get(2);
        TeilBrick vierterTeilBrick = teilBricks.get(3);

        if (typ == BrickTyp.I) {

            if (drehungInGrad == 90 || drehungInGrad == 270) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                dritterTeilBrick.setX(dritterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                dritterTeilBrick.setY(dritterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() - (2 * TeilBrick.SEITENLAENGE));
                vierterTeilBrick.setY(vierterTeilBrick.getY() + (2 * TeilBrick.SEITENLAENGE));

            } else {

                ersterTeilBrick.setX(ersterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                dritterTeilBrick.setX(dritterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                dritterTeilBrick.setY(dritterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() + (2 * TeilBrick.SEITENLAENGE));
                vierterTeilBrick.setY(vierterTeilBrick.getY() - (2 * TeilBrick.SEITENLAENGE));
            }
        }

        if (typ == BrickTyp.J) {

            if (drehungInGrad == 90) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() + (2 * TeilBrick.SEITENLAENGE));

                zweiterTeilBrick.setX(zweiterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                zweiterTeilBrick.setY(zweiterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                vierterTeilBrick.setY(vierterTeilBrick.getY() + TeilBrick.SEITENLAENGE);
            }

            if (drehungInGrad == 180) {

                ersterTeilBrick.setY(ersterTeilBrick.getY() + (2 * TeilBrick.SEITENLAENGE));

                zweiterTeilBrick.setX(zweiterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                zweiterTeilBrick.setY(zweiterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                vierterTeilBrick.setY(vierterTeilBrick.getY() - TeilBrick.SEITENLAENGE);
            }

            if (drehungInGrad == 270) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() - (2 * TeilBrick.SEITENLAENGE));

                zweiterTeilBrick.setX(zweiterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                zweiterTeilBrick.setY(zweiterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                vierterTeilBrick.setY(vierterTeilBrick.getY() - TeilBrick.SEITENLAENGE);
            }

            if (drehungInGrad == 0) {

                ersterTeilBrick.setY(ersterTeilBrick.getY() - (2 * TeilBrick.SEITENLAENGE));

                zweiterTeilBrick.setX(zweiterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                zweiterTeilBrick.setY(zweiterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                vierterTeilBrick.setY(vierterTeilBrick.getY() + TeilBrick.SEITENLAENGE);
            }
        }

        if (typ == BrickTyp.L) {

            if (drehungInGrad == 90) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                dritterTeilBrick.setX(dritterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                dritterTeilBrick.setY(dritterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setY(vierterTeilBrick.getY() + (2 * TeilBrick.SEITENLAENGE));
            }

            if (drehungInGrad == 180) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                dritterTeilBrick.setX(dritterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                dritterTeilBrick.setY(dritterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() - (2 * TeilBrick.SEITENLAENGE));
            }

            if (drehungInGrad == 270) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                dritterTeilBrick.setX(dritterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                dritterTeilBrick.setY(dritterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setY(vierterTeilBrick.getY() - (2 * TeilBrick.SEITENLAENGE));
            }

            if (drehungInGrad == 0) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                dritterTeilBrick.setX(dritterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                dritterTeilBrick.setY(dritterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() + (2 * TeilBrick.SEITENLAENGE));
            }
        }

        if (typ == BrickTyp.S) {

            if (drehungInGrad == 90 || drehungInGrad == 270) {

                zweiterTeilBrick.setX(zweiterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                zweiterTeilBrick.setY(zweiterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                dritterTeilBrick.setY(dritterTeilBrick.getY() - (2 * TeilBrick.SEITENLAENGE));

                vierterTeilBrick.setX(vierterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                vierterTeilBrick.setY(vierterTeilBrick.getY() - TeilBrick.SEITENLAENGE);
            }

            if (drehungInGrad == 180 || drehungInGrad == 0) {

                zweiterTeilBrick.setX(zweiterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                zweiterTeilBrick.setY(zweiterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                dritterTeilBrick.setY(dritterTeilBrick.getY() + (2 * TeilBrick.SEITENLAENGE));

                vierterTeilBrick.setX(vierterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                vierterTeilBrick.setY(vierterTeilBrick.getY() + TeilBrick.SEITENLAENGE);
            }
        }

        if (typ == BrickTyp.T) {

            if (drehungInGrad == 90) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                zweiterTeilBrick.setX(zweiterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                zweiterTeilBrick.setY(zweiterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                vierterTeilBrick.setY(vierterTeilBrick.getY() + TeilBrick.SEITENLAENGE);
            }

            if (drehungInGrad == 180) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                zweiterTeilBrick.setX(zweiterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                zweiterTeilBrick.setY(zweiterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                vierterTeilBrick.setY(vierterTeilBrick.getY() - TeilBrick.SEITENLAENGE);
            }

            if (drehungInGrad == 270) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                zweiterTeilBrick.setX(zweiterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                zweiterTeilBrick.setY(zweiterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                vierterTeilBrick.setY(vierterTeilBrick.getY() - TeilBrick.SEITENLAENGE);
            }

            if (drehungInGrad == 0) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                zweiterTeilBrick.setX(zweiterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                zweiterTeilBrick.setY(zweiterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                vierterTeilBrick.setY(vierterTeilBrick.getY() + TeilBrick.SEITENLAENGE);
            }
        }

        if (typ == BrickTyp.Z) {

            if (drehungInGrad == 90 || drehungInGrad == 270) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                dritterTeilBrick.setX(dritterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                dritterTeilBrick.setY(dritterTeilBrick.getY() - TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() - (2 * TeilBrick.SEITENLAENGE));
            }

            if (drehungInGrad == 180 || drehungInGrad == 0) {

                ersterTeilBrick.setX(ersterTeilBrick.getX() - TeilBrick.SEITENLAENGE);
                ersterTeilBrick.setY(ersterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                dritterTeilBrick.setX(dritterTeilBrick.getX() + TeilBrick.SEITENLAENGE);
                dritterTeilBrick.setY(dritterTeilBrick.getY() + TeilBrick.SEITENLAENGE);

                vierterTeilBrick.setX(vierterTeilBrick.getX() + (2 * TeilBrick.SEITENLAENGE));
            }
        }
    }

    public void positionZuruecksetzen() {

        while (getMinX() > 0)
            bewegen(-1, 0);

        while (getMinY() > 0)
            bewegen(0, -1);
    }

    public void zentrieren(int breite, int hoehe, SchrittweiteTyp schrittweiteTyp) {

        positionZuruecksetzen();

        int x = 0;
        int y = 0;

        if (schrittweiteTyp == SchrittweiteTyp.GROB) {

            x = (breite / 2) - (getMaxX() / 2);
            while (x % TeilBrick.SEITENLAENGE != 0)
                x -= TeilBrick.SEITENLAENGE / 2;

            if (hoehe > 0) {

                y = (hoehe / 2) - (getMaxY() / 2);
                while (y % TeilBrick.SEITENLAENGE != 0)
                    y -= TeilBrick.SEITENLAENGE / 2;
            }
        }

        if (schrittweiteTyp == SchrittweiteTyp.FEIN) {

            x = (breite / 2) - (getMaxX() / 2);

            if (hoehe > 0)
                y = (hoehe / 2) - TeilBrick.SEITENLAENGE;
        }

        bewegen(x, y);
    }

    public int getMinX() {

        int minX = Integer.MAX_VALUE;
        for (TeilBrick teilBrick : teilBricks)
            minX = Math.min(minX, teilBrick.getX());

        return minX;
    }

    public int getMaxX() {

        int maxX = 0;
        for (TeilBrick teilBrick : teilBricks)
            maxX = Math.max(maxX, teilBrick.getMaxX());

        return maxX;
    }

    public int getMinY() {

        int minY = Integer.MAX_VALUE;
        for (TeilBrick teilBrick : teilBricks)
            minY = Math.min(minY, teilBrick.getY());

        return minY;
    }

    public int getMaxY() {

        int maxY = 0;
        for (TeilBrick teilBrick : teilBricks)
            maxY = Math.max(maxY, teilBrick.getMaxY());

        return maxY + TeilBrick.SEITENLAENGE;
    }

    public void addTeilBrick(TeilBrick teilBrick) {
        teilBricks.add(teilBrick);
    }

    public List<TeilBrick> getTeilBricks() {
        return teilBricks;
    }

    public BrickTyp getTyp() {
        return typ;
    }

    public void setTyp(BrickTyp typ) {
        this.typ = typ;
    }

    public int getDrehungInGrad() {
        return drehungInGrad;
    }

    public void setDrehungInGrad(int drehungInGrad) {
        this.drehungInGrad = drehungInGrad;
    }
}
